class MyTransformCode{
  constructor(){
    // header长度
    this.packageHeaderLen = 4
    // 包的编号
    this.serialNum = 0
    // 要获取的消息体长度
    this.serialLen = 2
  }

  // 编码
  encode(data, serialNum){
    // 使用Buffer转换数据为二进制数据
    const body = Buffer.from(data)

    // 1. 先按照指定的长度来申请一片内存空间作为 header 来使用
    const headerBuf = Buffer.alloc(this.packageHeaderLen)
    // 2. 写入
    headerBuf.writeInt16BE(serialNum || this.serialNum)

    headerBuf.writeInt16BE(body.length, this.serialLen)

    // 编号自增
    if(serialNum===undefined){
      this.serialNum++
    }

    return Buffer.concat([headerBuf, body])
  }

  // 解码
  decode(buffer){
    const headerBuf = buffer.slice(0, this.packageHeaderLen)
    const bodyBuf = buffer.slice(this.packageHeaderLen)

    return {
      serialNum: headerBuf.readInt16BE(),
      bodyLength: headerBuf.readInt16BE(this.serialLen),
      body: bodyBuf.toString()
    }
  }

  // 获取包长度
  getPackageLen(buffer){
    if(buffer.length < this.packageHeaderLen){
      // buffer长度不够，无数据可取
      return 0
    }else{
      // 有数据可取
      return this.packageHeaderLen + buffer.readInt16BE(this.serialLen)
    }
  }
}

module.exports = MyTransformCode
